Pages

Tuesday, February 28, 2017

A New Player At The Outsource Development Market รข€“ Roobykon Software

KHARKOV, Ukraine - Feb. 28, 2017 - PRLog -- Roobykon Software, leading development team, went beyond home market and aims new customers all over the globe. The range of company's activities is vast and includes web design & development, applications & software development, the field of online games. Due to the wide range of capabilities, and years of successful work, the company decided to move ahead to the external markets.

Since 2011 Roobykon Software has been partnering with businesses from ambitious startups to large organizations to help them optimize brand efficiency, accelerate growth and innovation, and deliver new ideas to the market. At the same time, it always offers full lifecycle project implementation and consulting services (https://roobykon.com/ services). The team of software gurus takes projects at any stage and bring them to a successful conclusion, even if they were previously failed by others.

The company positions itself, as a strong squad of the brightest and inquiring minds in the industry, who build tight partnership and trusting relationships with customers, to understand their needs and deliver intuitive software. "Precisely because of the people for whom development has become a lifestyle, the Roobykon Software exceeds demands, drives success and rapidly moves forward," appropriately observes Konstantin Dynda, Roobykon's CTO.

At the recent time Roobykon has already built a solid portfolio (https://roobykon.com/ portfolio) and can truly proud of years cooperation with such successful companies as Global Revgen – delivers digital media consultancy and marketing campaign execution, Life Sherpa – provides a range of financial and credit services, Burst SMS – Australia's smartest online sms service and many others. But appetites of these IT enthusiasts are growing quickly and, they're actively seeking for new challenges to tackle.

Visit Roobykon at https://roobykon.com/ to learn more.

End


Source: A New Player At The Outsource Development Market – Roobykon Software

Monday, February 27, 2017

EasyEDA: The Cloud based Circuit and PCB design Software

EasyEDA is a free, zero-install, Web and Cloud-based EDA tool suite, integrating powerful schematic capture, mixed-mode circuit simulator and PCB layout in a seamless cross-platform browser environment, for electronic engineers, educators, students and hobbyists.

EasyEDA is a free, zero- install, cloud-based EDA tool, designed to give electrical engineers, educators, engineering students and electronics hobbyists an Easier EDA Experience. It is easy to use circuit design, circuit simulator and PCB design that runs in your web browser.

Features of EasyEDA:

Draw schematics quickly using the available libraries on browser. Seamless automatic upgrades.

Circuit Simulator Verify analog, digital and mixed signal circuits with spice subcircuits and models!

With multiple layers, thousands of pads, you could still operate quickly and layout smoothly.

The system is very stable, reliable and easy to learn. The user interface is very pleasant and

responsive operation.EasyEDA has a rich library of thousands of electronic components (for both circuits and printed circuit boards, and for modeling), and tens of thousands of examples of schematics! Anyone can use this library and expand it. It also can import existing designs done in Altium, Eagle and KiCad and then edit them in EasyEDA.

Once the board is done at EasyEDA, you can use their Gerberviewer(https://gerber-viewer.easyeda.com/) for a last minute check, then go ahead and order the production, at some very decent rates.


Source: EasyEDA: The Cloud based Circuit and PCB design Software

Sunday, February 26, 2017

Nokia's 3310 is back- new design, colours and software for the modern feature phone

​The Nokia 3310 was a breakthrough phone when it arrived in 2000. It's prime features were the presence of a calculator, stopwatch and 4 games: Snake II, Pairs II, Space Impact and Bantumi. Now, Nokia is bringing back the 3310 in its classic form factor: the tiny screen (which is now a colour display), the number pad and the direction and select buttons. And it comes in glossy red and yellow, matte black and dark blue colours.

​The new Nokia 3310 is a redesign from the inside out. It is slimmer, has a 2 MP camera, Nokia's Series 30+ software and, a 2.4" QVGA display and is lighter than the original. A custom designed UI envelopes the system giving it a fresh take. While is it not meant to be an internet phone, it does have a basic web browser. The new phone has support for 32 GB Micro SD card, two SIM cards and it has a headphone jack!

And while all these changes might make this a very different phone for a very different era, Nokia promises the same outstanding battery life and experience. The battery on this phone does 22 hours of talk time and lasts a month on standby. And guess what - Nokia has redesigned Snake for the colour display, in an epic throwback to the 2000's.

While this phone is not necessarily meant to be used as a primary device in this era, it is a really solid backup phone. It is priced at €49 (USD 52 or CAD 68), and it's worth it for all that nostalgia.

Ke ep Technonerding!

Follow Technonerds on Facebook and Twitter


Source: Nokia's 3310 is back- new design, colours and software for the modern feature phone

Saturday, February 25, 2017

Development Design Testing marketing by varitas

Feb 25, 2017

We know that looks do matter - both in terms of the image you present to the world and the ease of use that good graphic design can lend to the user interface of a software product. Our portfolio contains examples that showcase our graphic and human interface design skills. Varitas IT Solutions has been building Web-based software solutions since 2015. We bring traditional software engineering methodology and discipline to Web development - delivering robust solutions quickly and efficiently at lower cost. We respect deadlines, understand budgets and stand by everything we develop. Despite our focus on engineering, we know that looks do matter - both in terms of the image you present to the world and the ease of use that good graphic design can lend to the user interface of a software product.Our portfolio contains examples that showcase our graphic and human interface design skills. We understand that everybody has their unique strengths and we put that knowledge to use by assemb ling the most efficient team possible for your project. We bring traditional software engineering methodology and discipline to Web development - delivering robust solutions quickly and efficiently at lower cost. We respect deadlines, understand budgets and stand by everything we develop.We bring traditional software engineering methodology and discipline to Web development - delivering robust solutions quickly and efficiently at lower cost. We respect deadlines, understand budgets and stand by everything we develop. Despite our focus on engineering, we know that looks do matter - both in terms of the image you present to the world and the ease of use that good graphic design can lend to the user interface of a software product. Our portfolio contains examples that showcase our graphic and human interface design skills. We understand that everybody has their unique strengths and we put that knowledge to use by assembling the most efficient team possible for your project.

About the Author

You know your business better than anyone. Your insights, combined with our skills and creativity, will result in branding and marketing that truly stand out. We're ready to get started.

Rating:

(Average: Not rated)

Please enable JavaScript to view the comments.


Source: Development Design Testing marketing by varitas

Friday, February 24, 2017

How to Fix Your Church Bulletin Design

Growing up, my brothers and I used to have a lot of fun teasing our dad about his quirky habits.

One in particular that still stands out in my memory is how, every Sunday after mass, he would take the church bulletin, roll it up like a sacred scroll, and tuck it into the back pocket of his suit pants.

That church bulletin became as characteristic for him as the ever-present cup of coffee in his hand, and I'd be surprised if there isn't a stash of those curled bulletins filed carefully away somewhere in my parents' home.

To my father and many others, the church bulletin was and is as necessary to Sunday service as the Bible or hymnal.

Web sites, email lists, and video announcements sent out through a centralized church management software are all fine and have their place, but what about the churchgoer that still doesn't have a smartphone? Or what about the first time visitor who would be lost without a physical church bulletin in their hand as a roadmap?

church bulletin design

As Kevin D. Hendricks, editor of Church Marketing Sucks wrote, "The bottom line is that [the church bulletin] is an important component in how a church communicates. It's likely the one thing visitors and members will take home with them."

A 2014 study by Thom S. Rainer revealed that most churches still use some form of printed bulletin despite the digital revolution, and most guests expect to be handed something by a greeter when they enter the church.

With worship attendance declining by 3.7% at the same time the overall population increased by 16 million, an effective church bulletin is as important now as it ever was.

6 Essential elements of good church bulletin design

When it comes to church bulletin design a little restraint can go a long way.

While it may be tempting to take all that great info you have compiled on your church's web site and cram it into an eight-page leaflet every week, that strategy will only end up pleasing none.

In his book, Unwelcome: 50 Ways Churches Drive Away First-Time Visitors, Jonathan Malm asks "What if we curated our announcements? What if we chose the one or two things we wanted to communicate or advertise to guests and kept it to that?"

For example, Malm suggests, why list the senior citizen board game night in your church bulletin when you know that it only applies to eight members and they already communicate with each other reliably through their own channels?

On the other hand, the church picnic, which is open to the entire congregation plus guests and visitors, warrants top billing in the bulletin.

For his article, "15 Lessons from 17 Different Church Bulletins," Rich Birch sifted through more than 100 church bulletins from across the country. He noticed that the largest churches tended to have the smallest bulletins, and that the essential information boiled down to:

  • Website and social media information, so guests know where to find you online
  • Physical address and phone number, so they know how to come back
  • A welcome message, targeted at first-time visitors
  • Some sort of tear-off card that guests can fill out and drop off for follow-up
  • An event listing that filters out all but the most important events catering to the majority
  • Many bulletins also include ample blank space for note taking, and to let the eyes breathe
  • That's it! No need for a listing of every service and small ministry group scheduled for the next month, no lengthy Bible readings, no comprehensive listings of board members. All of that information has a place, but it doesn't have to be in the church bulletin.

    To see just how effective a minimalist approach to church bulletin design can be, look at this bulletin from North Point Community Church in Atlanta. Then there's this example of an overstuffed bulletin from Doncaster Church of Christ in Victoria, Australia.

    See the difference?

    5 Digital church bulletin supplements

    The beauty of the digital revolution is the millions of trees that can go on just being trees instead of countless pamphlets, brochures, and leaflets that just get tossed into landfills.

    While some churches have phased out church bulletins altogether, anecdotal evidence suggests that they regret it sooner rather than later.

    But by trimming your church bulletin down to the size of a postcard and relocating the extraneous information to a more appropriate space, you can conserve paper and communicate more effectively.

    Here are five digital methods to supplement your church bulletin.

  • Video announcements. A prerecorded video announcement can make a personal connection with visitors in a way that text and grainy pictures never could. Fear not, church video announcements don't have to be boring or dry, they can be awesome.
  • Email bulletins. If reading this article has made you shudder at the thought of losing information like birth announcements, prayer requests, or the Pokemon-themed youth group, fear not. Sprawl, within reason, is OK in an email newsletter.
  • Church website. Think of your church website as the dynamic, vast church bulletin that is always there. The trick is getting new visitors to find it. That is why a streamlined church bulletin that directs visitors to your website for more information is a solid two-pronged strategy. Follow this approach and you'll be well on your way to a righteous church website.
  • Church app. If your church is super cool and open to smartphone usage during the service, you may not need a print bulletin at all. That's because your guests can download a PDF of the bulletin through your app and have it at their fingertips. As an added bonus, you won't have to worry about them leaving their $800 phones strewn across the pews after the service.
  • Social media. The church picnic is in three hours but a tornado warning has just been announced. You can't update the website in time, the weekly email newsletter has already been sent out, and the stack of paper bulletins is sitting around doing nothing. Twitter to the rescue! There's nothing like social media when you need to reach the masses quickly.
  • But how do I fix my church bulletin design?

    So now we've looked into why church bulletins are still important, what belongs in a modern church bulletin, and how to use technology to make your church bulletins more effective.

    But if you came here looking for advice on how to make your outdated church bulletin look better, we've also got you covered.

    Why start from scratch when there are already countless tried and true church bulletin designs to choose from?

    The church bulletin is dead, long live the church bulletin

    The biggest fallacy when it comes to the usefulness of church bulletins is trying to land on a catch-all approach that addresses every church's unique needs. Some churches will happily communicate exclusively through their print bulletin for decades to come, while others may relegate print communication to a once-a-month welcome card.

    As church marketing expert Steve Fogg points out, the right course of action should be dictated by the members of your church, not the church leaders who are attempting to predict the future.

    "Your printed bulletin is brilliant for people who are still finding their way into your church. I know for some of you tech savvy people this feels old and slow. But as communicators we need to communicate at our audience's pace. Not our own,"

    How does your church approach weekly communication? What methods have you found to be most effective? Let us know in the comments!


    Source: How to Fix Your Church Bulletin Design

    Thursday, February 23, 2017

    Which pricing model is best for your web design business?

    Hourly vs. flat rate vs. mixed

    Which pricing model is best for your web design business?

    It's probably the biggest question any freelancer faces: how should I price my services? Which pricing model is best for my business?

    For some people, this is an emotional issue. Usually, human resource departments decide an employee's value and many tend to undervalue skills outside the executive suite.

    Factor in the hours most full-time website designers or developers work and this devaluation is even more pronounced. You can get a pretty good idea of your value when you take time to consider what you bring to the table for a client who needs a new website and lacks either the time, skills, or both.

    To decide on a pricing model …

    Take these four steps into consideration:

  • Determine the true costs of running your business.
  • Educate your clients about costs.
  • Understand the pros and cons of hourly vs. per-project rates.
  • Consider blending the two into a mixed-rate pricing model.
  • Let's look at these in more detail.

    1. Determine the true costs of running your business

    Like any business, website design and development requires tools that cost money. These are investments in your business that must be factored into the consideration of your pricing model. The first thing you want to do is list these costs. Here are a few examples:

  • Equipment: Computers, monitors, software, maintenance.
  • Subscriptions and licenses: Hosting; domains; premium add-ons for software like WooCommerce; Shutterstock; ThemeForest; management platforms; and so on.
  • Overhead: Internet, phone, rent/mortgage (even if you work from home), utilities.
  • This is how much you're investing in your own business to simply hang up a shingle.

    And even if you think that working from home isn't really a cost, it is. You're using more utilities than you otherwise would. Keep in mind that working from home also means "losing" space for your home office — a space you might otherwise use for an extra bedroom, hobby room, or (wo)man cave.

    Pricing Model Work From HomeSecond, focus on the expense required to develop and maintain the design and technical skills you bring to a website project. These skills include some of the following:

  • Education and training: Fees and travel-related expenses.
  • Marketing your business: Advertisement costs, tickets and travel to industry events, blogging (or hiring a blogger to write) about your business, time spent on social media.
  • All of this adds up in your operating costs.

    2. Educate your clients about costs.

    "Are web design costs more accurately reflected in hourly rates or per-project flat rates?"

    That's the question your customers will weigh when they review your rates. However, as we've discussed, it's not a fair way to look at the true costs to you, the website designer. Perhaps a broader conversation about website design costs is needed for both the customer and provider. This requires educating clients about costs.

    Pricing models or pricing guides are excellent tools to demonstrate the basic website design costs that are required to build a simple, functioning website.

    A good pricing model educates clients about the real costs to them and to the website designer or developer they select.

    In addition, there is a real push for transparency these days. If your business is using well-known and respected tools, there's no reason not to give your customers (and potential customers) information about upfront website design costs like domain registration, hosting fees, themes, plugins and content support.

    For example: Our company, Mode Effect, specializes in WordPress and WooCommerce website design and development. We provide a WooCommerce pricing guide for a typical WooCommerce customer. It covers everything from site-related costs to shipping fees and marketing expenses.

    The pricing guide even offers a checklist to make it as easy as possible to see upfront and continual costs.

    3. Understand the pros and cons of hourly rates versus per-project rates

    If you thought setting a rate is difficult, deciding how to charge for your services can be equally challenging. Opinions and preferences about hourly rates or project pricing models vary among freelancers and customers.

    Hourly rates

    Most freelancers start out quoting hourly rates because they don't know how much to charge. Many will use the rate they used to be paid at former jobs as a baseline.

    If you decide to charge an hourly rate, be sure to research the full picture of hourly pay for employees with your level of expertise. Then factor in the costs discussed above.

    Here are some of the benefits to the hourly rate setup:

  • It gives you an idea about how long it takes you to complete different kinds of website projects, which can be helpful for scheduling your time.
  • It makes most clients a little more conscientious about your time.
  • It's useful if you're offering additional "ร  la carte" services such as logo design or animation.
  • Per-project rates

    Many clients ask for a complete project cost because it's easier to factor the project into marketing budgets. There are definite advantages here for freelancers as well:

  • It helps you turn a profit sooner as you become more skilled and can complete projects faster.
  • Clients tend to see more value because they aren't looking at the same clock you are during the design stage.
  • You can build in the nickel-and-dime services most clients request — particularly those clients who take a big-picture look at website design services.
  • Moving to project fees is also a natural step away from the hourly rate.

    Once you recognize your time frame on different types of projects, you can accurately predict hours most of the time. Convert these hours into a project fee and add some cushion for unexpected expenses and interruptions that might otherwise add costs to your side.

    4. Consider blending the two options into a mixed-rate pricing model

    Some web designers charge a flat fee for website development and an hourly rate afterward for additional services that fall outside the project scope. Examples include site maintenance, software and content updates, and changes requested after the project is completed.

    These mixed pricing models seem to be a favored approach, according to comments on a recent blog by Gregory Ciotti for the proposal software provider Bidsketch.

    Use your pricing model to remind clients that most of the cost is up front, in the design & development stage.

    Not all your customers will understand the true costs to get a website up-and-running. It might take some time, but with the right tweaks, you will find a pricing model that balances your costs, the value you bring to a customer, and the time you spend on a website's design.

    This will keep you competitive while you earn a living and a healthy profit!


    Source: Which pricing model is best for your web design business?

    Wednesday, February 22, 2017

    London tech firm wins top web design honours

    A London technology business has won international honours for web design and development.

    Digital Echidna has been cited by a Washington-based technology research firm as one of the leading web design and web development companies in Canada, based on customer satisfaction.

    "We take great pride in our work and we believe strongly in fostering a positive and long-lasting relationship with our clients," said Digital Echidna's owner, Andrew McClenaghan.

    "From developing a comprehensive understanding of our clients' needs and goals, to offering ongoing support post-launch, we are committed to client satisfaction and we are honoured to receive recognition of this type."

    The featured companies were evaluated based on industry experience and market presence. The methodology used by Clutch, the research company, examines how businesses fared in delivering results to clients, based on interviews with current and past clients

    "Recognition of this nature validates the efforts we've put in to developing a strong and diverse team, which combines leading development, project management, creative, content, and sales and business support to provide our clients with premium value and solutions that meet their business needs," McClenaghan added.

    "We believe strongly in the foundation of customer service we've built and we will continue to grow our business based upon these ideals and efforts."

    Along with Digital Echidna, the following Canadian companies are listed as leaders this year: ImageX, Myplanet, Cheeky Monkey Media Inc., Demac Media, Therefore Interactive, Master of Code Global, Backbone Technology, Brewhouse Software and OPTASY

    Digital Echidna, on King Street, has been in business as a web development firms since 1999. It has a strong presence in the educational, medical, and government and public sector markets, and counts Dartmouth College, London Health Sciences Centre, Fanshawe College, TVOntario, and the Art Gallery of Ontario among its clients

    "As the competitive landscape of the web continues to grow, so do the skill sets required by top web firms," said Alex Miller, senior analyst at Clutch. "The firms honoured here, and the success of their projects, exhibit the impressive skill sets of Canada's leading digital talent." 


    Source: London tech firm wins top web design honours

    Tuesday, February 21, 2017

    Vention.io is a Web-based Machine Builder Platform & Social Marketplace

    A Montreal-based startup is about to shake the world of design automation. Vention, a new browser-based machine builder platform, launched in beta today. They provide a social marketplace of industrial equipment for purchase and a 3D machine builder with library of components to construct your own equipment.

    The platform and 3D machine builder is 100% free to use. (The company relies on the sales of the products for revenue generation.) You can log in, immediately start adding parts from a library of pre-defined structural, motion, control, and hardware parts and components. The interface allows a drag-drop-and-snap in place method of assembling any type of structure through an AI-enabled 3D constraint system. As parts are added, all cost and weight is calculated in real-time and shown on the screen with fastener requirement calculated automatically.

    On top of this, designs published to the public can be used as a starting point, modified or re-configured. New assembly designs can be started collaboratively, invitations set to additional collaborators or private groups set up. Download of the 3D part or 3D drawing file is available for offline design and download of the 3D assembly is available from within the machine builder.

    vention.io-3d-web-machine-builder-platform-01The Vention 3D Machine Builder interface with drag-and-drop library of parts and components.

    When talking with Etienne Lacroix, CEO of Vention, he explained that this isn't 3D modeling software, but a whole new way of building assemblies for both professional CAD users and non-professionals alike.

    "It became obvious to us that the next frontier for faster machine design wasn't better design tools or higher performance hardware, but rather the integration between the two. The launch of our beta program is a first step in enabling our partners to experience a novel design and build workflow that will accelerate the machine design process more than 5-fold."

    Inside of this is a complete elimination of any 2D drawings or manual BOM management–it all happens automatically–and Vention is driving it all with a heavy focus on artificial intelligence both in the builder and the marketplace, a system built to constantly learn.  Here's what the beta version of Vention platform includes:

  • A library of structural, motion, and control components.
  • A free cloud-based 3D Machine Builder.
  • Artificial intelligence-enabled 3D constraints
  • Real-time cost and weight in the 3D Machine Builder environment.
  • Automatic fasteners and bill of material management.
  • Access to a library of user-generated public designs.
  • Invitation of individual collaborators to a design.
  • Ability to set up a private design group.
  • Submission of new component ideas.
  • Personalized assembly instructions with purchase orders.
  • The company received an unspecified pre-seed round of funding led by Bolt and Real Ventures, along with some familiar names in the 3D software scene, Jon Stevenson, former exec at PTC and GrabCAD, and Rob Stevens, former exec at GrabCAD and Amazon Robotics.

    I'm fascinated by the 3D machine builder and the technology behind it. It's the most advanced 3D product assembly interface I've seen and, I believe, is a great example of the shift we'll see in 3D product development over the coming years. The applications for this spread far beyond machine design, but Vention has started out with a focus that hits a wide set of industries where custom equipment builds are constantly needed in a sector no one else is thinking about. Keep an eye on this company and the tech they're developing.

    Library part with ability to add to your own design, purchase, download and comment on.Library part with ability to add to your own design, purchase, download and comment on.

    vention.io-3d-web-machine-builder-platform-02


    Source: Vention.io is a Web-based Machine Builder Platform & Social Marketplace

    Monday, February 20, 2017

    ร… KODA Drives New Brand with Mobile- First Website

    LONDON, February 20, 2017 /PRNewswire/ --

    ล KODA UK has revealed a new digital presence to support the launch of its latest campaign - 'Driven by Something Different' - marking a change in direction for the car brand.

    Aiming to adopt the smart use of software and design to enhance how customers interact with its brand online, ล KODA UK sought to deliver a more engaging digital experience that was in keeping with its new brand identity.

    The UK team worked closely with established digital agency Reading Room, an Idox company, to reimagine its mobile presence in a project turnaround time of just two months. With over 40% of traffic to the sites of UK automotive brands now from a smartphone, the mobile element was a key focus area for the project.

    The new website and mobile experience delivers a brand-led and progressive look and feel, reflecting ล KODA UK's vision and focus towards customer-led positioning. Enhanced usability sits at the heart of the work, with the site's layout, functionality and structure all designed to be as intuitive as possible for the mobile user.

    The new site has launched successfully, with future enhancements already planned to optimise the platform and support ล KODA UK in meeting ambitious growth targets.

    John Davies, Managing Director of Reading Room said: "The team wanted to create a digital presence that was just as ambitious and exciting as ล KODA's new brand direction. The end product is a great example of the collaborative efforts from across the agency covering strategy, user experience, design and technology, with all of us poised to continue to evolve the site and push the brand even further digitally."

    In addition to the new web and mobile presence, ล KODA UK's brand campaign was supported by a new TV advert fronted by Sir Bradley Wiggins and launched on 4 February 2017. The advert debuted during the England vs France Six Nations rugby match at Twickenham Stadium the same day.

    To view the new ล KODA website, visit http://www.skoda.co.uk or http://m.skoda.co.uk for the mobile site.

    Email: marketing@idoxgroup.com for more information.

    SOURCE Idox


    Source: ล KODA Drives New Brand with Mobile- First Website

    Sunday, February 19, 2017

    Graphic Designer - Visual Communicator

    Creative problem solver. Well versed in the use of advanced design software and technology as well as print media. With a broad range of experience in the design and development of Visual Solutions to enhance marketing efforts in a graphically appealing way, leading clients and customers to targeted growth expectations and satisfactory outcomes.

  • Marketing & Communications Coordinator

    • Responsible for conceptualizing, creating and delivering marketing ideas, activities and print and online materials such as product labels, packaging, mock ups, presentations & sales sheets.• Worked under the lead of Senior VP to establish and implement corporate identity and product line brand structure and branding guidelines to be applied on different print and online marketing collateral, website and corporate identity material.• Led design and maintenance of website using Wordpress.• Coordinated with client's creative teams to design and develop private labels. Coordinated technical and legal label regulations with Q&A department, which in turn generated more than $100,000 in net revenues for the company and consolidated business relations with the top leading national retailers.

  • Graphic Designer - Product Design
  • Freelance
  • Los Angeles, CA
  • Feb 2015 - Jul 2015 (5 months)
  • Worked in collaboration with creative agencies as freelance designer collaborating in diverse projects such as Branding & Logo Design, Marketing Collateral products, Packaging, Front end web & e-mail template design, digital signage and illustration.

  • Graphic Designer & Social Media Coordinator

    Led creation and development of social media platform and media marketing strategy and initiatives to promote online language courses using Skype and keep students up-to-date on relevant academic information. Resulting in the increment of student request for courses in 40% and in keeping students enrolled for longer periods.

    Concept and design of marketing collateral such as landing page, e-mail newsletter templates and blog + content, weekly social media postings & content curation in accord with social media plan and following corporate branding principles.

  • Digital Graphic Designer & Media Marketing Assistant

    Created and designed +10 monthly multimedia advertising and marketing products such as web banners, static and pop-up ads.

    Front end web page creation, design and maintenance of landing pages and email templates and marketing blasts.Concept and design of social media content, mock up templates and content curation.

    Conceptualized corporate and advertising digital signage menus for companies and user interface client apps, resulting in a 65% increment of client delivery time and 20% company net income increment.

  • Creative Director & Language Instruction Coordinator
  • All Trade Innovation C.A.
  • Caracas, Venezuela
  • Jan 2008 - Jul 2014 (6 years 6 months)
  • Project: The English Teacher Language System

    Conceptualized and designed visual system teaching methodology and instructional material for English language course comprised of 100 lesson plans, including tests, exercises, marketing, administrative and student tracking materials.

    Imparted in-presence and online lessons over 6 years to 300+ students, all of them achieving target TOEFL scores.Incremented client portfolio & student enrollment 25% each year resulting in a 75% increment in net income per year.

    Led teacher training program which allowed to cover a higher demand of courses.

  • Graphic Designer for Print & Packaging

    Coordinated the creation and design of +50 monthly large order print jobs, such as posters, books and covers & +30 marketing collateral products such as brochures, calendars, print ads and consumer goods packaging products such as bags and boxes as well as product labels for leading consumer brands, municipalities and NGOs following legal regulations.

    Designed mockups and product presentations and met with internal departments and vendors to discuss project constituents, materials, output recommendations, timeline, print estimates and media requirements to maintain productivity levels over 80% and net revenue above $30,000 monthly.

  • Graphic Designer & Post-Production Assistant

    Assisted art director in design, editing and retouching of digital on screen graphics such as static title sequences, lower thirds and transitions for +6 monthly broadcaster high rated soap operas.

    Managed audiovisual library database, organized, classified, catalogued and sourced from +1000 TV commercials, +400 TV shows +300 corporate videos improving production team efficiency.

    Assembled product presentations of thumbnail sketching of storyboards for producers to illustrate advertising agency concepts.

    Designed weekly DVD menus and packaging for videos delivered to corporate clients.

  • Children's Teaching Center Coordinator & Instructor

    Imparted English, Spanish TOEFL and IELTS courses over two years to 600+ students of all ages.

    Designed courses' instructional material and led teacher training program that resulted in 5 new accredited teachers per month and an increment of 60% in student enrollment. Company net income grew 72% in a 2 year span.

  • Information Assistant

    Supervised Physical Resources, Adult Library, Children's Library and planned weekly events for information center. * Attended 100+ per month student and prospective customer enquiries on educational and cultural issues.

    Handled finances for course and test customer registrations averaging 200 students per month.

  • Software Instructor
  • Forum Asesores, C.A.
  • Caracas, Venezuela
  • Sep 2001 - Sep 2002 (1 year)
  • Imparted Adobe Photoshop, Adobe Illustrator courses to groups.Developed educational material for students and promotional material for the company.


    Source: Graphic Designer - Visual Communicator

    Saturday, February 18, 2017

    Design Patterns for Humansรข„¢ - An ultra-simplified explanation

    README.md

    Design Patterns For Humans

    ๐ŸŽ‰ Ultra-simplified explanation to design patterns! ๐ŸŽ‰

    A topic that can easily make anyone's mind wobble. Here I try to make them stick in to your mind (and maybe mine) by explaining them in the simplest way possible.

    Design patterns are solutions to recurring problems; guidelines on how to tackle certain problems. They are not classes, packages or libraries that you can plug into your application and wait for the magic to happen. These are, rather, guidelines on how to tackle certain problems in certain situations.

    Design patterns solutions to recurring problems; guidelines on how to tackle certain problems

    Wikipedia describes them as

    In software engineering, a software design pattern is a general reusable solution to a commonly occurring problem within a given context in software design. It is not a finished design that can be transformed directly into source or machine code. It is a description or template for how to solve a problem that can be used in many different situations.

    ⚠️ Be Careful
  • Design patterns are not a silver bullet to all your problems.
  • Do not try to force them; bad things are supposed to happen, if done so. Keep in mind that design patterns are solutions to problems, not solutions finding problems; so don't overthink.
  • If used in a correct place in a correct manner, they can prove to be a savior; or else they can result in a horrible mess of a code.
  • Types of Design Patterns

    In plain words

    Creational patterns are focused towards how to instantiate an object or group of related objects.

    Wikipedia says

    In software engineering, creational design patterns are design patterns that deal with object creation mechanisms, trying to create objects in a manner suitable to the situation. The basic form of object creation could result in design problems or added complexity to the design. Creational design patterns solve this problem by somehow controlling this object creation.

    ๐Ÿ  Simple Factory

    Real world example

    Consider, you are building a house and you need doors. It would be a mess if every time you need a door, you put on your carpenter clothes and start making a door in your house. Instead you get it made from a factory.

    In plain words

    Simple factory simply generates an instance for client without exposing any instantiation logic to the client

    Wikipedia says

    In object-oriented programming (OOP), a factory is an object for creating other objects – formally a factory is a function or method that returns objects of a varying prototype or class from some method call, which is assumed to be "new".

    Programmatic Example

    First of all we have a door interface and the implementation

    interface Door { public function getWidth() : float; public function getHeight() : float; } class WoodenDoor implements Door { protected $width; protected $height; public function __construct(float $width, float $height) { $this->width = $width; $this->height = $height; } public function getWidth() : float { return $this->width; } public function getHeight() : float { return $this->height; } }

    Then we have our door factory that makes the door and returns it

    class DoorFactory { public static function makeDoor($width, $height) : Door { return new WoodenDoor($width, $height); } }

    And then it can be used as

    $door = DoorFactory::makeDoor(100, 200); echo 'Width: ' . $door->getWidth(); echo 'Height: ' . $door->getHeight();

    When to Use?

    When creating an object is not just a few assignments and involves some logic, it makes sense to put it in a dedicated factory instead of repeating the same code everywhere.

    ๐Ÿญ Factory Method

    Real world example

    Consider the case of a hiring manager. It is impossible for one person to interview for each of the positions. Based on the job opening, she has to decide and delegate the interview steps to different people.

    In plain words

    It provides a way to delegate the instantiation logic to child classes.

    Wikipedia says

    In class-based programming, the factory method pattern is a creational pattern that uses factory methods to deal with the problem of creating objects without having to specify the exact class of the object that will be created. This is done by creating objects by calling a factory method—either specified in an interface and implemented by child classes, or implemented in a base class and optionally overridden by derived classes—rather than by calling a constructor.

    Programmatic Example

    Taking our hiring manager example above. First of all we have an interviewer interface and some implementations for it

    interface Interviewer { public function askQuestions(); } class Developer implements Interviewer { public function askQuestions() { echo 'Asking about design patterns!'; } } class CommunityExecutive implements Interviewer { public function askQuestions() { echo 'Asking about community building'; } }

    Now let us create our HiringManager

    abstract class HiringManager { // Factory method abstract public function makeInterviewer() : Interviewer; public function takeInterview() { $interviewer = $this->makeInterviewer(); $interviewer->askQuestions(); } }

    Now any child can extend it and provide the required interviewer

    class DevelopmentManager extends HiringManager { public function makeInterviewer() : Interviewer { return new Developer(); } } class MarketingManager extends HiringManager { public function makeInterviewer() : Interviewer { return new CommunityExecutive(); } }

    and then it can be used as

    $devManager = new DevelopmentManager(); $devManager->takeInterview(); // Output: Asking about design patterns $marketingManager = new MarketingManager(); $marketingManager->takeInterview(); // Output: Asking about community building.

    When to use?

    Useful when there is some generic processing in a class but the required sub-class is dynamically decided at runtime. Or putting it in other words, when the client doesn't know what exact sub-class it might need.

    ๐Ÿ”จ Abstract Factory

    Real world example

    Extending our door example from Simple Factory. Based on your needs you might get a wooden door from a wooden door shop, iron door from an iron shop or a PVC door from the relevant shop. Plus you might need a guy with different kind of specialities to fit the door, for example a carpenter for wooden door, welder for iron door etc. As you can see there is a dependency between the doors now, wooden door needs carpenter, iron door needs a welder etc.

    In plain words

    A factory of factories; a factory that groups the individual but related/dependent factories together without specifying their concrete classes.

    Wikipedia says

    The abstract factory pattern provides a way to encapsulate a group of individual factories that have a common theme without specifying their concrete classes

    Programmatic Example

    Translating the door example above. First of all we have our Door interface and some implementation for it

    interface Door { public function getDescription(); } class WoodenDoor implements Door { public function getDescription() { echo 'I am a wooden door'; } } class IronDoor implements Door { public function getDescription() { echo 'I am an iron door'; } }

    Then we have some fitting experts for each door type

    interface DoorFittingExpert { public function getDescription(); } class Welder implements DoorFittingExpert { public function getDescription() { echo 'I can only fit iron doors'; } } class Carpenter implements DoorFittingExpert { public function getDescription() { echo 'I can only fit wooden doors'; } }

    Now we have our abstract factory that would let us make family of related objects i.e. wooden door factory would create a wooden door and wooden door fitting expert and iron door factory would create an iron door and iron door fitting expert

    interface DoorFactory { public function makeDoor() : Door; public function makeFittingExpert() : DoorFittingExpert; } // Wooden factory to return carpenter and wooden door class WoodenDoorFactory implements DoorFactory { public function makeDoor() : Door { return new WoodenDoor(); } public function makeFittingExpert() : DoorFittingExpert{ return new Carpenter(); } } // Iron door factory to get iron door and the relevant fitting expert class IronDoorFactory implements DoorFactory { public function makeDoor() : Door { return new IronDoor(); } public function makeFittingExpert() : DoorFittingExpert{ return new Welder(); } }

    And then it can be used as

    $woodenFactory = new WoodenDoorFactory(); $door = $woodenFactory->makeDoor(); $expert = $woodenFactory->makeFittingExpert(); $door->getDescription(); // Output: I am a wooden door $expert->getDescription(); // Output: I can only fit wooden doors // Same for Iron Factory $ironFactory = new IronDoorFactory(); $door = $ironFactory->makeDoor(); $expert = $ironFactory->makeFittingExpert(); $door->getDescription(); // Output: I am an iron door $expert->getDescription(); // Output: I can only fit iron doors

    As you can see the wooden door factory has encapsulated the carpenter and the wooden door also iron door factory has encapsulated the iron door and welder. And thus it had helped us make sure that for each of the created door, we do not get a wrong fitting expert.

    When to use?

    When there are interrelated dependencies with not-that-simple creation logic involved

    ๐Ÿ‘ท Builder

    Real world example

    Imagine you are at Hardee's and you order a specific deal, lets say, "Big Hardee" and they hand it over to you without any questions; this is the example of simple factory. But there are cases when the creation logic might involve more steps. For example you want a customized Subway deal, you have several options in how your burger is made e.g what bread do you want? what types of sauces would you like? What cheese would you want? etc. In such cases builder pattern comes to the rescue.

    In plain words

    Allows you to create different flavors of an object while avoiding constructor pollution. Useful when there could be several flavors of an object. Or when there are a lot of steps involved in creation of an object.

    Wikipedia says

    The builder pattern is an object creation software design pattern with the intentions of finding a solution to the telescoping constructor anti-pattern.

    Having said that let me add a bit about what telescoping constructor anti-pattern is. At one point or the other we have all seen a constructor like below:

    public function __construct($size, $cheese = true, $pepperoni = true, $tomato = false, $lettuce = true) { }

    As you can see; the number of constructor parameters can quickly get out of hand and it might become difficult to understand the arrangement of parameters. Plus this parameter list could keep on growing if you would want to add more options in future. This is called telescoping constructor anti-pattern.

    Programmatic Example

    The sane alternative is to use the builder pattern. First of all we have our burger that we want to make

    class Burger { protected $size; protected $cheeze = false; protected $pepperoni = false; protected $lettuce = false; protected $tomato = false; public function __construct(BurgerBuilder $builder) { $this->size = $builder->size; $this->cheeze = $builder->cheeze; $this->pepperoni = $builder->pepperoni; $this->lettuce = $builder->lettuce; $this->tomato = $builder->tomato; } }

    And then we have the builder

    class BurgerBuilder { public $size; public $cheeze = false; public $pepperoni = false; public $lettuce = false; public $tomato = false; public function __construct(int $size) { $this->size = $size; } public function addPepperoni() { $this->pepperoni = true; return $this; } public function addLettuce() { $this->lettuce = true; return $this; } public function addCheeze() { $this->cheeze = true; return $this; } public function addTomato() { $this->tomato = true; return $this; } public function build() : Burger { return new Burger($this); } }

    And then it can be used as:

    $burger = (new BurgerBuilder(14)) ->addPepperoni(); ->addLettuce(); ->addTomato(); ->build();

    When to use?

    When there could be several flavors of an object and to avoid the constructor telescoping. The key difference from the factory pattern is that; factory pattern is to be used when the creation is a one step process while builder pattern is to be used when the creation is a multi step process.

    ๐Ÿ‘ Prototype

    Real world example

    Remember dolly? The sheep that was cloned! Lets not get into the details but the key point here is that it is all about cloning

    In plain words

    Create object based on an existing object through cloning.

    Wikipedia says

    The prototype pattern is a creational design pattern in software development. It is used when the type of objects to create is determined by a prototypical instance, which is cloned to produce new objects.

    In short, it allows you to create a copy of an existing object and modify it to your needs, instead of going through the trouble of creating an object from scratch and setting it up.

    Programmatic Example

    In PHP, it can be easily done using clone

    class Sheep { protected $name; protected $category; public function __construct(string $name, string $category = 'Mountain Sheep') { $this->name = $name; $this->category = $category; } public function setName(string $name) { $this->name = $name; } public function getName() { return $this->name; } public function setCategory(string $category) { $this->category = $category; } public function getCategory() { return $this->category; } }

    Then it can be cloned like below

    $original = new Sheep('Jolly'); echo $original->getName(); // Jolly echo $original->getCategory(); // Mountain Sheep // Clone and modify what is required $cloned = clone $original; $cloned->setName('Dolly'); echo $cloned->getName(); // Dolly echo $cloned->getCategory(); // Mountain sheep

    Also you could use the magic method __clone to modify the cloning behavior.

    When to use?

    When an object is required that is similar to existing object or when the creation would be expensive as compared to cloning.

    ๐Ÿ’ Singleton

    Real world example

    There can only be one president of a country at a time. The same president has to be brought to action, whenever duty calls. President here is singleton.

    In plain words

    Ensures that only one object of a particular class is ever created.

    Wikipedia says

    In software engineering, the singleton pattern is a software design pattern that restricts the instantiation of a class to one object. This is useful when exactly one object is needed to coordinate actions across the system.

    Singleton pattern is actually considered an anti-pattern and overuse of it should be avoided. It is not necessarily bad and could have some valid use-cases but should be used with caution because it introduces a global state in your application and change to it in one place could affect in the other areas and it could become pretty difficult to debug. The other bad thing about them is it makes your code tightly coupled plus it mocking the singleton could be difficult.

    Programmatic Example

    To create a singleton, make the constructor private, disable cloning, disable extension and create a static variable to house the instance

    final class President { private static $instance; private function __construct() { // Hide the constructor } public static function getInstance() : President { if (!self::$instance) { self::$instance = new self(); } return self::$instance; } private function __clone() { // Disable cloning } }

    Then in order to use

    $president1 = President::getInstance(); $president2 = President::getInstance(); var_dump($president1 === $president2); // true

    In plain words

    Structural patterns are mostly concerned with object composition or in other words how the entities can use each other. Or yet another explanation would be, they help in answering "How to build a software component?"

    Wikipedia says

    In software engineering, structural design patterns are design patterns that ease the design by identifying a simple way to realize relationships between entities.

    ๐Ÿ”Œ Adapter

    Real world example

    Consider that you have some pictures in your memory card and you need to transfer them to your computer. In order to transfer them you need some kind of adapter that is compatible with your computer ports so that you can attach memory card to your computer. In this case card reader is an adapter. Another example would be the famous power adapter; a three legged plug can't be connected to a two pronged outlet, it needs to use a power adapter that makes it compatible with the two pronged outlet. Yet another example would be a translator translating words spoken by one person to another

    In plain words

    Adapter pattern lets you wrap an otherwise incompatible object in an adapter to make it compatible with another class.

    Wikipedia says

    In software engineering, the adapter pattern is a software design pattern that allows the interface of an existing class to be used as another interface. It is often used to make existing classes work with others without modifying their source code.

    Programmatic Example

    Consider a game where there is a hunter and he hunts lions.

    First we have an interface Lion that all types of lions have to implement

    interface Lion { public function roar(); } class AfricanLion implements Lion { public function roar() {} } class AsianLion implements Lion { public function roar() {} }

    And hunter expects any implementation of Lion interface to hunt.

    class Hunter { public function hunt(Lion $lion) { } }

    Now let's say we have to add a WildDog in our game so that hunter can hunt that also. But we can't do that directly because dog has a different interface. To make it compatible for our hunter, we will have to create an adapter that is compatible

    // This needs to be added to the game class WildDog { public function bark() {} } // Adapter around wild dog to make it compatible with our game class WildDogAdapter implements Lion { protected $dog; public function __construct(WildDog $dog) { $this->dog = $dog; } public function roar() { $this->dog->bark(); } }

    And now the WildDog can be used in our game using WildDogAdapter.

    $wildDog = new WildDog(); $wildDogAdapter = new WildDogAdapter($wildDog); $hunter = new Hunter(); $hunter->hunt($wildDogAdapter); ๐Ÿšก Bridge

    Real world example

    Consider you have a website with different pages and you are supposed to allow the user to change the theme. What would you do? Create multiple copies of each of the pages for each of the themes or would you just create separate theme and load them based on the user's preferences? Bridge pattern allows you to do the second i.e.

    With and without the bridge pattern

    In Plain Words

    Bridge pattern is about preferring composition over inheritance. Implementation details are pushed from a hierarchy to another object with a separate hierarchy.

    Wikipedia says

    The bridge pattern is a design pattern used in software engineering that is meant to "decouple an abstraction from its implementation so that the two can vary independently"

    Programmatic Example

    Translating our WebPage example from above. Here we have the WebPage hierarchy

    interface WebPage { public function __construct(Theme $theme); public function getContent(); } class About implements WebPage { protected $theme; public function __construct(Theme $theme) { $this->theme = $theme; } public function getContent() { return "About page in " . $this->theme->getColor(); } } class Careers implements WebPage { protected $theme; public function __construct(Theme $theme) { $this->theme = $theme; } public function getContent() { return "Careers page in " . $this->theme->getColor(); } }

    And the separate theme hierarchy

    interface Theme { public function getColor(); } class DarkTheme implements Theme { public function getColor() { return 'Dark Black'; } } class LightTheme implements Theme { public function getColor() { return 'Off white'; } } class AquaTheme implements Theme { public function getColor() { return 'Light blue'; } }

    And both the hierarchies

    $darkTheme = new DarkTheme(); $about = new About($darkTheme); $careers = new Careers($darkTheme); echo $about->getContent(); // "About page in Dark Black"; echo $careers->getContent(); // "Careers page in Dark Black"; ๐ŸŒฟ Composite

    Real world example

    Every organization is composed of employees. Each of the employees has same features i.e. has a salary, has some responsibilities, may or may not report to someone, may or may not have some subordinates etc.

    In plain words

    Composite pattern lets clients to treat the individual objects in a uniform manner.

    Wikipedia says

    In software engineering, the composite pattern is a partitioning design pattern. The composite pattern describes that a group of objects is to be treated in the same way as a single instance of an object. The intent of a composite is to "compose" objects into tree structures to represent part-whole hierarchies. Implementing the composite pattern lets clients treat individual objects and compositions uniformly.

    Programmatic Example

    Taking our employees example from above. Here we have different employee types

    interface Employee { public function __construct(string $name, float $salary); public function getName() : string; public function setSalary(float $salary); public function getSalary() : float; public function getRoles() : array; } class Developer implements Employee { protected $salary; protected $name; public function __construct(string $name, float $salary) { $this->name = $name; $this->salary = $salary; } public function getName() : string { return $this->name; } public function setSalary(float $salary) { $this->salary = $salary; } public function getSalary() : float { return $this->salary; } public function getRoles() : array { return $this->roles; } } class Designer implements Employee { protected $salary; protected $name; public function __construct(string $name, float $salary) { $this->name = $name; $this->salary = $salary; } public function getName() : string { return $this->name; } public function setSalary(float $salary) { $this->salary = $salary; } public function getSalary() : float { return $this->salary; } public function getRoles() : array { return $this->roles; } }

    Then we have an organization which consists of several different types of employees

    class Organization { protected $employees; public function addEmployee(Employee $employee) { $this->employees[] = $employee; } public function getNetSalaries() : float { $netSalary = 0; foreach ($this->employees as $employee) { $netSalary += $employee->getSalary(); } return $netSalary; } }

    And then it can be used as

    // Prepare the employees $john = new Developer('John Doe', 12000); $jane = new Designer('Jane', 10000); // Add them to organization $organization = new Organization(); $organization->addEmployee($john); $organization->addEmployee($jane); echo "Net salaries: " . $organization->getNetSalaries(); // Net Salaries: 22000 ☕ Decorator

    Real world example

    Imagine you run a car service shop offering multiple services. Now how do you calculate the bill to be charged? You pick one service and dynamically keep adding to it the prices for the provided services till you get the final cost. Here each type of service is a decorator.

    In plain words

    Decorator pattern lets you dynamically change the behavior of an object at run time by wrapping them in an object of a decorator class.

    Wikipedia says

    In object-oriented programming, the decorator pattern is a design pattern that allows behavior to be added to an individual object, either statically or dynamically, without affecting the behavior of other objects from the same class. The decorator pattern is often useful for adhering to the Single Responsibility Principle, as it allows functionality to be divided between classes with unique areas of concern.

    Programmatic Example

    Lets take coffee for example. First of all we have a simple coffee implementing the coffee interface

    interface Coffee { public function getCost(); public function getDescription(); } class SimpleCoffee implements Coffee { public function getCost() { return 10; } public function getDescription() { return 'Simple coffee'; } }

    We want to make the code extensible to allow options to modify it if required. Lets make some add-ons (decorators)

    class MilkCoffee implements Coffee { protected $coffee; public function __construct(Coffee $coffee) { $this->coffee = $coffee; } public function getCost() { return $this->coffee->getCost() + 2; } public function getDescription() { return $this->coffee->getDescription() . ', milk'; } } class WhipCoffee implements Coffee { protected $coffee; public function __construct(Coffee $coffee) { $this->coffee = $coffee; } public function getCost() { return $this->coffee->getCost() + 5; } public function getDescription() { return $this->coffee->getDescription() . ', whip'; } } class VanillaCoffee implements Coffee { protected $coffee; public function __construct(Coffee $coffee) { $this->coffee = $coffee; } public function getCost() { return $this->coffee->getCost() + 3; } public function getDescription() { return $this->coffee->getDescription() . ', vanilla'; } }

    Lets make a coffee now

    $someCoffee = new SimpleCoffee(); echo $someCoffee->getCost(); // 10 echo $someCoffee->getDescription(); // Simple Coffee $someCoffee = new MilkCoffee($someCoffee); echo $someCoffee->getCost(); // 12 echo $someCoffee->getDescription(); // Simple Coffee, milk $someCoffee = new WhipCoffee($someCoffee); echo $someCoffee->getCost(); // 17 echo $someCoffee->getDescription(); // Simple Coffee, milk, whip $someCoffee = new VanillaCoffee($someCoffee); echo $someCoffee->getCost(); // 20 echo $someCoffee->getDescription(); // Simple Coffee, milk, whip, vanilla ๐Ÿ“ฆ Facade

    Real world example

    How do you turn on the computer? "Hit the power button" you say! That is what you believe because you are using a simple interface that computer provides on the outside, internally it has to do a lot of stuff to make it happen. This simple interface to the complex subsystem is a facade.

    In plain words

    Facade pattern provides a simplified interface to a complex subsystem.

    Wikipedia says

    A facade is an object that provides a simplified interface to a larger body of code, such as a class library.

    Programmatic Example Taking our computer example from above. Here we have the computer class

    class Computer { public function getElectricShock() { echo "Ouch!"; } public function makeSound() { echo "Beep beep!"; } public function showLoadingScreen() { echo "Loading.."; } public function bam() { echo "Ready to be used!"; } public function closeEverything() { echo "Bup bup bup buzzzz!"; } public function sooth() { echo "Zzzzz"; } public function pullCurrent() { echo "Haaah!"; } }

    Here we have the facade

    class ComputerFacade { protected $computer; public function __construct(Computer $computer) { $this->computer = $computer; } public function turnOn() { $this->computer->getElectricShock(); $this->computer->makeSound(); $this->computer->showLoadingScreen(); $this->computer->bam(); } public function turnOff() { $this->computer->closeEverything(); $this->computer->pullCurrent(); $this->computer->sooth(); } }

    Now to use the facade

    $computer = new ComputerFacade(new Computer()); $computer->turnOn(); // Ouch! Beep beep! Loading.. Ready to be used! $computer->turnOff(); // Bup bup buzzz! Haah! Zzzzz ๐Ÿƒ Flyweight

    Real world example

    Did you ever have fresh tea from some stall? They often make more than one cup that you demanded and save the rest for any other customer so to save the resources e.g. gas etc. Flyweight pattern is all about that i.e. sharing.

    In plain words

    It is used to minimize memory usage or computational expenses by sharing as much as possible with similar objects.

    Wikipedia says

    In computer programming, flyweight is a software design pattern. A flyweight is an object that minimizes memory use by sharing as much data as possible with other similar objects; it is a way to use objects in large numbers when a simple repeated representation would use an unacceptable amount of memory.

    Programmatic example Translating our tea example from above. First of all we have tea types and tea maker

    // Anything that will be cached is flyweight. // Types of tea here will be flyweights. class KarakTea { } // Acts as a factory and saves the tea class TeaMaker { protected $availableTea = []; public function make($preference) { if (empty($this->availableTea[$preference])) { $this->availableTea[$preference] = new KarakTea(); } return $this->availableTea[$preference]; } }

    Then we have the TeaShop which takes orders and serves them

    class TeaShop { protected $orders; protected $teaMaker; public function __construct(TeaMaker $teaMaker) { $this->teaMaker = $teaMaker; } public function takeOrder(string $teaType, int $table) { $this->orders[$table] = $this->teaMaker->make($teaType); } public function serve() { foreach($this->orders as $table => $tea) { echo "Serving tea to table# " . $table; } } }

    And it can be used as below

    $teaMaker = new TeaMaker(); $shop = new TeaShop($teaMaker); $shop->takeOrder('less sugar', 1); $shop->takeOrder('more milk', 2); $shop->takeOrder('without sugar', 5); $shop->serve(); // Serving tea to table# 1 // Serving tea to table# 2 // Serving tea to table# 5 ๐ŸŽฑ Proxy

    Real world example

    Have you ever used an access card to go through a door? There are multiple options to open that door i.e. it can be opened either using access card or by pressing a button that bypasses the security. The door's main functionality is to open but there is a proxy added on top of it to add some functionality. Let me better explain it using the code example below.

    In plain words

    Using the proxy pattern, a class represents the functionality of another class.

    Wikipedia says

    A proxy, in its most general form, is a class functioning as an interface to something else. A proxy is a wrapper or agent object that is being called by the client to access the real serving object behind the scenes. Use of the proxy can simply be forwarding to the real object, or can provide additional logic. In the proxy extra functionality can be provided, for example caching when operations on the real object are resource intensive, or checking preconditions before operations on the real object are invoked.

    Programmatic Example Taking our security door example from above. Firstly we have the door interface and an implementation of door

    interface Door { public function open(); public function close(); } class LabDoor implements Door { public function open() { echo "Opening lab door"; } public function close() { echo "Closing the lab door"; } }

    Then we have a proxy to secure any doors that we want

    class Security { protected $door; public function __construct(Door $door) { $this->door = $door; } public function open($password) { if ($this->authenticate($password)) { $this->door->open(); } else { echo "Big no! It ain't possible."; } } public function authenticate($password) { return $password === '$ecr@t' } public function close() { $this->door->close(); } }

    And here is how it can be used

    $door = new Security(new LabDoor()); $door->open('invalid'); // Big no! It ain't possible. $door->open('$ecr@t'); // Opening lab door $door->close(); // Closing lab door

    Yet another example would be some sort of data-mapper implementation. For example, I recently made an ODM (Object Data Mapper) for MongoDB using this pattern where I wrote a proxy around mongo classes while utilizing the magic method __call(). All the method calls were proxied to the original mongo class and result retrieved was returned as it is but in case of find or findOne data was mapped to the required class objects and the object was returned instead of Cursor.

    In plain words

    It is concerned with assignment of responsibilities between the objects. What makes them different from structural patterns is they don't just specify the structure but also outline the patterns for message passing/communication between them. Or in other words, they assist in answering "How to run a behavior in software component?"

    Wikipedia says

    In software engineering, behavioral design patterns are design patterns that identify common communication patterns between objects and realize these patterns. By doing so, these patterns increase flexibility in carrying out this communication.

    ๐Ÿ”— Chain of Responsibility

    Real world example

    For example, you have three payment methods (A, B and C) setup in your account; each having a different amount in it. A has 100 USD, B has 300 USD and C having 1000 USD and the preference for payments is chosen as A then B then C. You try to purchase something that is worth 210 USD. Using Chain of Responsibility, first of all account A will be checked if it can make the purchase, if yes purchase will be made and the chain will be broken. If not, request will move forward to account B checking for amount if yes chain will be broken otherwise the request will keep forwarding till it finds the suitable handler. Here A, B and C are links of the chain and the whole phenomenon is Chain of Responsibility.

    In plain words

    It helps building a chain of objects. Request enters from one end and keeps going from object to object till it finds the suitable handler.

    Wikipedia says

    In object-oriented design, the chain-of-responsibility pattern is a design pattern consisting of a source of command objects and a series of processing objects. Each processing object contains logic that defines the types of command objects that it can handle; the rest are passed to the next processing object in the chain.

    Programmatic Example

    Translating our account example above. First of all we have a base account having the logic for chaining the accounts together and some accounts

    abstract class Account { protected $successor; protected $balance; public function setNext(Account $account) { $this->successor = $account; } public function pay(float $amountToPay) { if ($this->canPay($amountToPay)) { echo sprintf('Paid %s using %s' . PHP_EOL, $amount, get_called_class()); } else if ($this->successor) { echo sprintf('Cannot pay using %s. Proceeding ..' . PHP_EOL, get_called_class()); $this->successor->pay($amountToPay); } else { throw Exception('None of the accounts have enough balance'); } } public function canPay($amount) : bool { return $this->balance <= $amount; } } class Bank extends Account { protected $balance; public function __construct(float $balance) { $this->$balance = $balance; } } class Paypal extends Account { protected $balance; public function __construct(float $balance) { $this->$balance = $balance; } } class Bitcoin extends Account { protected $balance; public function __construct(float $balance) { $this->$balance = $balance; } }

    Now let's prepare the chain using the links defined above (i.e. Bank, Paypal, Bitcoin)

    // Let's prepare a chain like below // $bank->$paypal->$bitcoin // // First priority bank // If bank can't pay then paypal // If paypal can't pay then bit coin $bank = new Bank(100); // Bank with balance 100 $paypal = new Paypal(200); // Paypal with balance 200 $bitcoin = new Bitcoin(300); // Bitcoin with balance 300 $bank->setNext($paypal); $paypal->setNext($bitcoin); // Let's try to pay using the first priority i.e. bank $bank->pay(259); // Output will be // ============== // Cannot pay using bank. Proceeding .. // Cannot pay using paypal. Proceeding ..: // Paid 259 using Bitcoin! ๐Ÿ‘ฎ Command

    Real world example

    A generic example would be you ordering a food at restaurant. You (i.e. Client) ask the waiter (i.e. Invoker) to bring some food (i.e. Command) and waiter simply forwards the request to Chef (i.e. Receiver) who has the knowledge of what and how to cook. Another example would be you (i.e. Client) switching on (i.e. Command) the television (i.e. Receiver) using a remote control (Invoker).

    In plain words

    Allows you to encapsulate actions in objects. The key idea behind this pattern is to provide the means to decouple client from receiver.

    Wikipedia says

    In object-oriented programming, the command pattern is a behavioral design pattern in which an object is used to encapsulate all information needed to perform an action or trigger an event at a later time. This information includes the method name, the object that owns the method and values for the method parameters.

    Programmatic Example

    First of all we have the receiver that has the implementation of every action that could be performed

    // Receiver class Bulb { public function turnOn() { echo "Bulb has been lit"; } public function turnOff() { echo "Darkness!"; } }

    then we have an interface that each of the commands are going to implement and then we have a set of commands

    interface Command { public function execute(); public function undo(); public function redo(); } // Command class TurnOn implements Command { protected $bulb; public function __construct(Bulb $bulb) { $this->bulb = $bulb; } public function execute() { $this->bulb->turnOn(); } public function undo() { $this->bulb->turnOff(); } public function redo() { $this->execute(); } } class TurnOff implements Command { protected $bulb; public function __construct(Bulb $bulb) { $this->bulb = $bulb; } public function execute() { $this->bulb->turnOff(); } public function undo() { $this->bulb->turnOn(); } public function redo() { $this->execute(); } }

    Then we have an Invoker with whom the client will interact to process any commands

    // Invoker class RemoteControl { public function submit(Command $command) { $command->execute(); } }

    Finally let's see how we can use it in our client

    $bulb = new Bulb(); $turnOn = new TurnOnCommand($bulb); $turnOff = new TurnOffCommand($bulb); $remote = new RemoteControl(); $remoteControl->submit($turnOn); // Bulb has been lit! $remoteControl->submit($turnOff); // Darkness!

    Command pattern can also be used to implement a transaction based system. Where you keep maintaining the history of commands as soon as you execute them. If the final command is successfully executed, all good otherwise just iterate through the history and keep executing the undo on all the executed commands.

    ➿ Iterator

    Real world example

    An old radio set will be a good example of iterator, where user could start at some channel and then use next or previous buttons to go through the respective channels. Or take an example of MP3 player or a TV set where you could press the next and previous buttons to go through the consecutive channels or in other words they all provide an interface to iterate through the respective channels, songs or radio stations.

    In plain words

    It presents a way to access the elements of an object without exposing the underlying presentation.

    Wikipedia says

    In object-oriented programming, the iterator pattern is a design pattern in which an iterator is used to traverse a container and access the container's elements. The iterator pattern decouples algorithms from containers; in some cases, algorithms are necessarily container-specific and thus cannot be decoupled.

    Programmatic example In PHP it is quite easy to implement using SPL (Standard PHP Library). Translating our radio stations example from above. First of all we have RadioStation

    class RadioStation { protected $frequency; public function __construct(float $frequency) { $this->frequency = $frequency; } public function getFrequency() : float { return $this->frequency; } }

    Then we have our iterator

    use Countable; use Iterator; class StationList implements Countable, Iterator { /** @var RadioStation[] $stations */ protected $stations = []; /** @var int $counter */ protected $counter; public function addStation(RadioStation $station) { $this->stations[] = $station; } public funtion removeStation(RadioStation $toRemove) { $toRemoveFrequency = $toRemove->getFrequency(); $this->stations = array_filter($this->stations, function (RadioStation $station) use ($toRemoveFrequency) { return $station->getFrequency() !== $toRemoveFrequency; }); } public function count() : int { return count($this->stations); } public function current() : RadioStation { return $this->stations[$this->counter]; } public function key() { return $this->counter; } public function next() { $this->counter++; } public function rewind() { $this->counter = 0; } public function valid(): bool { return isset($this->stations[$this->counter]); } }

    And then it can be used as

    $stationList = new StationList(); $stationList->addStation(new Station(89)); $stationList->addStation(new Station(101)); $stationList->addStation(new Station(102)); $stationList->addStation(new Station(103.2)); foreach($stationList as $station) { echo $station->getFrequency() . PHP_EOL; } $stationList->removeStation(new Station(89)); // Will remove station 89

    Real world example

    A general example would be when you talk to someone on your mobile phone, there is a network provider sitting between you and them and your conversation goes through it instead of being directly sent. In this case network provider is mediator.

    In plain words

    Mediator pattern adds a third party object (called mediator) to control the interaction between two objects (called colleagues). It helps reduce the coupling between the classes communicating with each other. Because now they don't need to have the knowledge of each other's implementation.

    Wikipedia says

    In software engineering, the mediator pattern defines an object that encapsulates how a set of objects interact. This pattern is considered to be a behavioral pattern due to the way it can alter the program's running behavior.

    Programmatic Example

    Here is the simplest example of a chat room (i.e. mediator) with users (i.e. colleagues) sending messages to each other.

    First of all, we have the mediator i.e. the chat room

    // Mediator class ChatRoom implements ChatRoomMediator { public function showMessage(User $user, string $message) { $time = date('M d, y H:i'); $sender = $user->getName(); echo $time . '[' . $sender . ']:' . $message; } }

    Then we have our users i.e. colleagues

    class User { protected $name; protected $chatMediator; public function __construct(string $name, ChatRoomMediator $chatMediator) { $this->name = $name; $this->chatMediator = $chatMediator; } public function getName() { return $this->name; } public function send($message) { $this->chatMediator->showMessage($this, $message); } }

    And the usage

    $mediator = new ChatRoom(); $john = new User('John Doe', $mediator); $jane = new User('Jane Doe', $mediator); $john->send('Hi there!'); $jane->send('Hey!'); // Output will be // Feb 14, 10:58 [John]: Hi there! // Feb 14, 10:58 [Jane]: Hey! ๐Ÿ’พ Memento

    Real world example

    Take the example of calculator (i.e. originator), where whenever you perform some calculation the last calculation is saved in memory (i.e. memento) so that you can get back to it and maybe get it restored using some action buttons (i.e. caretaker).

    In plain words

    Memento pattern is about capturing and storing the current state of an object in a manner that it can be restored later on in a smooth manner.

    Wikipedia says

    The memento pattern is a software design pattern that provides the ability to restore an object to its previous state (undo via rollback).

    Usually useful when you need to provide some sort of undo functionality.

    Programmatic Example

    Lets take an example of text editor which keeps saving the state from time to time and that you can restore if you want.

    First of all we have our memento object that will be able to hold the editor state

    class EditorMemento { protected $content; public function __construct(string $content) { $this->content = $content; } public function getContent() { return $this->content; } }

    Then we have our editor i.e. originator that is going to use memento object

    class Editor { protected $content = ''; public function type(string $words) { $this->content = $this->content . ' ' . $words; } public function getContent() { return $this->content; } public function save() { return new EditorMemento($this->content); } public function restore(EditorMemento $memento) { $this->content = $memento->getContent(); } }

    And then it can be used as

    $editor = new Editor(); // Type some stuff $editor->type('This is the first sentence.'); $editor->type('This is second.'); // Save the state to restore to : This is the first sentence. This is second. $saved = $editor->save(); // Type some more $editor->type('And this is third.'); // Output: Content before Saving echo $editor->getContent(); // This is the first sentence. This is second. And this is third. // Restoring to last saved state $editor->restore($saved); $editor->getContent(); // This is the first sentence. This is second. ๐Ÿ˜Ž Observer

    Real world example

    A good example would be the job seekers where they subscribe to some job posting site and they are notified whenever there is a matching job opportunity.

    In plain words

    Defines a dependency between objects so that whenever an object changes its state, all its dependents are notified.

    Wikipedia says

    The observer pattern is a software design pattern in which an object, called the subject, maintains a list of its dependents, called observers, and notifies them automatically of any state changes, usually by calling one of their methods.

    Programmatic example

    Translating our example from above. First of all we have job seekers that need to be notified for a job posting

    class JobPost { protected $title; public function __construct(string $title) { $this->title = $title; } public function getTitle() { return $this->title; } } class JobSeeker implements Observer { protected $name; public function __construct(string $name) { $this->name = $name; } public function onJobPosted(JobPost $job) { // Do something with the job posting echo 'Hi ' . $this->name . '! New job posted: '. $job->getTitle(); } }

    Then we have our job postings to which the job seekers will subscribe

    class JobPostings implements Observable { protected $observers = []; protected function notify(JobPost $jobPosting) { foreach ($this->observers as $observer) { $observer->onJobPosted($jobPosting); } } public function attach(Observer $observer) { $this->observers[] = $observer; } public function addJob(JobPost $jobPosting) { $this->notify($jobPosting); } }

    Then it can be used as

    // Create subscribers $johnDoe = new JobSeeker('John Doe'); $janeDoe = new JobSeeker('Jane Doe'); $kaneDoe = new JobSeeker('Kane Doe'); // Create publisher and attach subscribers $jobPostings = new JobPostings(); $jobPostings->attach($johnDoe); $jobPostings->attach($janeDoe); // Add a new job and see if subscribers get notified $jobPostings->addJob(new JobPost('Software Engineer')); // Output // Hi John Doe! New job posted: Software Engineer // Hi Jane Doe! New job posted: Software Engineer ๐Ÿƒ Visitor

    Real world example

    Consider someone visiting Dubai. They just need a way (i.e. visa) to enter Dubai. After arrival, they can come and visit any place in Dubai on their own without having to ask for permission or to do some leg work in order to visit any place here; just let them know of a place and they can visit it. Visitor pattern let's you do just that, it helps you add places to visit so that they can visit as much as they can without having to do any legwork.

    In plain words

    Visitor pattern let's you add further operations to objects without having to modify them.

    Wikipedia says

    In object-oriented programming and software engineering, the visitor design pattern is a way of separating an algorithm from an object structure on which it operates. A practical result of this separation is the ability to add new operations to existing object structures without modifying those structures. It is one way to follow the open/closed principle.

    Programmatic example

    Let's take an example of a zoo simulation where we have several different kinds of animals and we have to make them Sound. Let's translate this using visitor pattern

    // Visitee interface Animal { public function accept(AnimalOperation $operation); } // Visitor interface AnimalOperation { public function visitMonkey(Monkey $monkey); public function visitLion(Lion $lion); public function visitDolphin(Dolphin $dolphin); }

    Then we have our implementations for the animals

    class Monkey implements Animal { public function shout() { echo 'Ooh oo aa aa!'; } public function accept(AnimalOperation $operation) { $operation->visitMonkey($this); } } class Lion implements Animal { public function roar() { echo 'Roaaar!'; } public function accept(AnimalOperation $operation) { $operation->visitLion($this); } } class Dolphin implements Animal { public function speak() { echo 'Tuut tuttu tuutt!'; } public function accept(AnimalOperation $operation) { $operation->visitDolphin($this); } }

    Let's implement our visitor

    class Speak implements AnimalOperation { public function visitMonkey(Monkey $monkey) { $monkey->shout(); } public function visitLion(Lion $lion) { $lion->roar(); } public function visitDolphin(Dolphin $dolphin) { $dolphin->speak(); } }

    And then it can be used as

    $monkey = new Monkey(); $lion = new Lion(); $dolphin = new Dolphin(); $speak = new Speak(); $monkey->accept($speak); // Ooh oo aa aa! $lion->accept($speak); // Roaaar! $dolphin->accept($speak); // Tuut tutt tuutt!

    We could have done this simply by having a inheritance hierarchy for the animals but then we would have to modify the animals whenever we would have to add new actions to animals. But now we will not have to change them. For example, let's say we are asked to add the jump behavior to the animals, we can simply add that by creating a new visitor i.e.

    class Jump implements AnimalOperation { public function visitMonkey(Monkey $monkey) { echo 'Jumped 20 feet high! on to the tree!'; } public function visitLion(Lion $lion) { echo 'Jumped 7 feet! Back on the ground!'; } public function visitDolphin(Dolphin $dolphin) { echo 'Walked on water a little and disappeared'; } }

    And for the usage

    $jump = new Jump(); $monkey->accept($speak); // Ooh oo aa aa! $monkey->accept($jump); // Jumped 20 feet high! on to the tree! $lion->accept($speak); // Roaaar! $lion->accept($jump); // Jumped 7 feet! Back on the ground! $dolphin->accept($speak); // Tuut tutt tuutt! $dolphin->accept($jump); // Walked on water a little and disappeared ๐Ÿ’ก Strategy

    Real world example

    Consider the example of sorting, we implemented bubble sort but the data started to grow and bubble sort started getting very slow. In order to tackle this we implemented Quick sort. But now although the quick sort algorithm was doing better for large datasets, it was very slow for smaller datasets. In order to handle this we implemented a strategy where for small datasets, bubble sort will be used and for larger, quick sort.

    In plain words

    Strategy pattern allows you to switch the algorithm or strategy based upon the situation.

    Wikipedia says

    In computer programming, the strategy pattern (also known as the policy pattern) is a behavioural software design pattern that enables an algorithm's behavior to be selected at runtime.

    Programmatic example

    Translating our example from above. First of all we have our strategy interface and different strategy implementations

    interface SortStrategy { public function sort(array $dataset) : array; } class BubbleSortStrategy implements SortStrategy { public function sort(array $dataset) : array { echo "Sorting using bubble sort"; // Do sorting return $dataset; } } class QuickSortStrategy implements SortStrategy { public function sort(array $dataset) : array { echo "Sorting using quick sort"; // Do sorting return $dataset; } }

    And then we have our client that is going to use any strategy

    class Sorter { protected $sorter; public function __construct(SortStrategy $sorter) { $this->sorter = $sorter; } public function sort(array $dataset) : array { return $this->sorter->sort($dataset); } }

    And it can be used as

    $dataset = [1, 5, 4, 3, 2, 8]; $sorter = new Sorter(new BubbleSortStrategy()); $sorter->sort($dataset); // Output : Sorting using bubble sort $sorter = new Sorter(new QuickSortStrategy()); $sorter->sort($dataset); // Output : Sorting using quick sort ๐Ÿ’ข State

    Real world example

    Imagine you are using some drawing application, you choose the paint brush to draw. Now the brush changes it's behavior based on the selected color i.e. if you have chosen red color it will draw in red, if blue then it will be in blue etc.

    In plain words

    It lets you change the behavior of a class when the state changes.

    Wikipedia says

    The state pattern is a behavioral software design pattern that implements a state machine in an object-oriented way. With the state pattern, a state machine is implemented by implementing each individual state as a derived class of the state pattern interface, and implementing state transitions by invoking methods defined by the pattern's superclass. The state pattern can be interpreted as a strategy pattern which is able to switch the current strategy through invocations of methods defined in the pattern's interface

    Programmatic example

    Let's take an example of text editor, it let's you change the state of text that is typed i.e. if you have selected bold, it starts writing in bold, if italic then in italics etc.

    First of all we have our state interface and some state implementations

    interface WritingState { public function write(string $words); } class UpperCase implements WritingState { public function write(string $words) { echo strtoupper($words); } } class LowerCase implements WritingState { public function write(string $words) { echo strtolower($words); } } class Default implements WritingState { public function write(string $words) { echo $words; } }

    Then we have our editor

    class TextEditor { protected $state; public function __construct(WritingState $state) { $this->state = $state; } public function setState(WritingState $state) { $this->state = $state; } public function type(string $words) { $this->state->write($words); } }

    And then it can be used as

    $editor = new TextEditor(new Default()); $editor->type('First line'); $editor->setState(new UpperCaseState()); $editor->type('Second line'); $editor->type('Third line'); $editor->setState(new LowerCaseState()); $editor->type('Fourth line'); $editor->type('Fifth line'); // Output: // First line // SECOND LINE // THIRD LINE // fourth line // fifth line ๐Ÿ“’ Template Method

    Real world example

    Suppose we are getting some house built. The steps for building might look like

  • Prepare the base of house
  • Build the walls
  • Add roof
  • Add other floors The order of these steps could never be changed i.e. you can't build the roof before building the walls etc but each of the steps could be modified for example walls can be made of wood or polyester or stone.
  • In plain words

    Template method defines the skeleton of how certain algorithm could be performed but defers the implementation of those steps to the children classes.

    Wikipedia says

    In software engineering, the template method pattern is a behavioral design pattern that defines the program skeleton of an algorithm in an operation, deferring some steps to subclasses. It lets one redefine certain steps of an algorithm without changing the algorithm's structure.

    Programmatic Example

    Imagine we have a build tool that helps us test, lint, build, generate build reports (i.e. code coverage reports, linting report etc) and deploy our app on the test server.

    First of all we have our base class that specifies the skeleton for the build algorithm

    abstract class Builder { // Template method public final function build() { $this->test(); $this->lint(); $this->assemble(); $this->deploy(); } public abstract function test(); public abstract function lint(); public abstract function build(); public abstract function deploy(); }

    Then we can have our implementations

    class AndroidBuilder extends Builder { public function test() { echo 'Running android tests'; } public function lint() { echo 'Linting the android code'; } public function assemble() { echo 'Assembling the android build'; } public function deploy() { echo 'Deploying android build to server'; } } class IosBuilder extends Builder { public function test() { echo 'Running ios tests'; } public function lint() { echo 'Linting the ios code'; } public function assemble() { echo 'Assembling the ios build'; } public function deploy() { echo 'Deploying ios build to server'; } }

    And then it can be used as

    $androidBuilder = new AndroidBuilder(); $androidBuilder->build(); // Output: // Running android tests // Linting the android code // Assembling the android build // Deploying android build to server $iosBuilder = new IosBuilder(); $iosBuilder->build(); // Output: // Running ios tests // Linting the ios code // Assembling the ios build // Deploying ios build to server ๐Ÿšฆ Wrap Up Folks

    And that about wraps it up. I will continue to improve this, so you might want to watch/star this repository to revisit. Also, I have plans on writing the same about the architectural patterns, stay tuned for it.

    ๐Ÿ‘ฌ Contribution License

    MIT © Kamran Ahmed


    Source: Design Patterns for Humans™ - An ultra-simplified explanation